tsc configuration
[4Free-FSE.git] / Individual Packages / Danbooru-Image-Adder.user.js
bloba84afec5dd6dca1620084f86c0fb54a093f5fad0
1 // ==UserScript==
2 // @name         Danbooru-Image-Adder
3 // @namespace    http://tampermonkey.net/
4 // @version      3.2
5 // @description  Add images to posts
6 // @author       ECHibiki /qa/
7 // @match *://boards.4chan.org/*
8 // @grant         GM_xmlhttpRequest
9 // @updateURL    https://github.com/ECHibiki/4chanX-FSE/raw/master/Individual%20Packages/Danbooru-Image-Adder.user.js
10 // @downloadURL  https://github.com/ECHibiki/4chanX-FSE/raw/master/Individual%20Packages/Danbooru-Image-Adder.user.js
11 // @run-at document-start
12 // ==/UserScript==
14 function alert4ChanX(message, type, time){
15         if(time == undefined) time = 10;
16     var detail = {type: type, content: message, lifetime: time};
17     if (typeof cloneInto === 'function') {
18         detail = cloneInto(detail, document.defaultView);
19     }
20     var event = new CustomEvent('CreateNotification', {bubbles: true, detail: detail});
21     document.dispatchEvent(event);
24 var number_of_posts = 0;
25 var page_number;
26 var json_page;
27 var json_tag;
28 var smallest_tag_size;
30 var top_page_max =  10000000;
31 var top_page = top_page_max;
32 var maximum_attempts = 20;
33 var number_of_attempts = maximum_attempts ;
35 var img_URL = "";
36 var send_URL = "";
37 var old_tags_before_change = "";
39 var timeout = false;
40 var failed_to_find_required_tags_state = false;
41 var tag_incorrect_state = false;
42 var tool_top_visible = false;
44 var time_max = 10;
45 var time = time_max;
46 var intervalFunction;
47 var timeout_functions = [];
48 var json_page_numbers_used = Array();
49 var previous_images = [];
50 var taggingFunction;
52 window_displayed = false;
54 var help_icon_source = " data:image/jpeg;base64,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"
57 //set listeners to build interface in 4chanX
58 var loaded = false;
59 document.addEventListener("QRDialogCreation", function(e){
60                 //create custom interface
61                 enhance4ChanX();
62                 //ENHANCE DUMP TABS (COVER, 482PX - 482PX)
63                 //DUMP LIST MAX-HEIGHT TO 490
64                 
65                 var width = parseInt(localStorage.getItem("width_DIA"));                
66                 var qr_width = parseInt(localStorage.getItem("qr_width_DIA"));          
67                 var height = parseInt(localStorage.getItem("height_DIA"));      
68         
69                 if(width === null) width = 400;
70                 if(qr_width === null) width = 480;
71                 if(height === null) height = 400;
73                 document.getElementById("fourchanx-css").textContent += ".qr-preview { height:" +  height + "px; width: " + width +  "px; left:8%;background-size: cover;}";
74                 document.getElementById("fourchanx-css").textContent += "#dump-list { min-height: " + (width - 20) +  "px; width: " + (qr_width) + "px;}";
76 }, false);
78 document.addEventListener("4chanXInitFinished", imageAdderButton);
80 //Alter 4chanX interface
81 var enhance4ChanX = function(){
82     var qr_window = document.getElementById("qr");
84     //check if elements already exist
85         /*Probably Depreciated*/
86     // if(document.getElementById("qrImages") !== null){
87         // qr_window.removeChild(document.getElementById("qrImages"));
88         // clearInterval(taggingFunction);
89         // //4chanx autodeletes images
90         // clearImage();
91     // }
92         
93     var imagedump_opener = document.getElementById("dump-button");
94     if(imagedump_opener !== null){imagedump_opener.click();}
95     else{return;}
97     var imagedump_file_list = document.getElementById("dump-list");
98     var filename_container = document.getElementById("qr-filename-container");
100     //used for setting and unsetting high resolution thumbs for dump list.
101     var dumplist_image = "";
102     var previous_dumplist_image = "";
103     var observer = new MutationObserver(function(mutate){
104         dumplist_image = imagedump_file_list.firstChild.style.backgroundImage;
105         if(dumplist_image !== previous_dumplist_image && img_URL !== ""){
106             imagedump_file_list.firstChild.style.backgroundImage = "url(" + img_URL + ")";
107             previous_dumplist_image = imagedump_file_list.firstChild.style.backgroundImage;
108         }
109         else if (img_URL == ""){
110         }
111     });
112     observer.observe(imagedump_file_list , {attributes: true,subtree:true, chilimagedump_file_list: true, characterData: true });
113     //make the image clear button clear images;
114     document.getElementById("qr-filerm").addEventListener("click", clearImage);
116     //image setting html elements.
117     var qr_image_adder_table = document.createElement("TABLE");
118     qr_image_adder_table.setAttribute("id", "qrImages");
119     qr_image_adder_table.setAttribute("style", "text-align:center");
120     qr_window.appendChild(qr_image_adder_table);
122     var options_row = document.createElement("TR");
123     options_row.setAttribute("ID", "or");
124     options_row.setAttribute("style", "margin:5px;");
125     qr_image_adder_table.appendChild(options_row);
126     var checkbox_safe = document.createElement("INPUT");
127     checkbox_safe.setAttribute("id", "safe");
128     checkbox_safe.setAttribute("type", "checkbox");
129     var checkbox_safe_text  = document.createTextNode("Safe");
130     var checkbox_questionable= document.createElement("INPUT");
131     checkbox_questionable.setAttribute("id", "questionable");
132     checkbox_questionable.setAttribute("type", "checkbox");
133     var checkbox_questionable_text= document.createTextNode("Questionable");
134     var checkbox_explicit = document.createElement("INPUT");
135     checkbox_explicit.setAttribute("id", "explicit");
136     checkbox_explicit.setAttribute("type", "checkbox");
137     var checkbox_explicit_text = document.createTextNode("Explicit");
139     options_row.appendChild(checkbox_safe_text);
140     options_row.appendChild(checkbox_safe);
141     options_row.appendChild(checkbox_questionable_text);
142     options_row.appendChild(checkbox_questionable);
143     options_row.appendChild(checkbox_explicit_text);
144     options_row.appendChild(checkbox_explicit);
146         option_text_size = "18";
148     var image_tagging_row = document.createElement("TR");
149         
150         var help_icon_container = document.createElement("A");
151         help_icon_container.href = "javascript:void(0)";
152         help_icon_container.title = "Click to View Help!";
153         var help_icon = document.createElement("IMG");
154         help_icon.setAttribute("style", "height:" + option_text_size * 1.25 + "px;margin:-4px 10px");
155         help_icon.src = help_icon_source;
157         help_icon_container.appendChild(help_icon);
158         image_tagging_row.appendChild(help_icon_container);
160         var tooltip_div = document.createElement("DIV");
161         tooltip_div.innerHTML = "Insert Tags to search from danbooru in the text box to the side.<br/>The URL for the image will be bellow. Some browsers such as chrome allow you to select this text<br/>Do Not Use \"order:\" tags<br/>Do Not Use \"rating:\" tags<br/>For more speed uncheck all boxes!<hr/>Submit bugs to <a href='https://github.com/ECHibiki/4chan-UserScripts'>my Github</a>";
162         tooltip_div.setAttribute("style", "z-index:9;padding:5px;border:1px solid black;background-color:white;word-wrap:break-word;display:none;position:absolute;");
163         help_icon_container.addEventListener("click", function(ev){
164                 if(tool_top_visible)
165                         tooltip_div.setAttribute("style", "z-index:9;padding:5px;border:1px solid black;background-color:white;word-wrap:break-word;display:none;position:absolute;");
166                 else
167                         tooltip_div.setAttribute("style", "z-index:9;padding:5px;border:1px solid black;background-color:white;word-wrap:break-word;display:block;position:absolute;"
168                                 + "left:" +  (ev.clientX - qr_window.getBoundingClientRect().x) +
169                                 "px;top:" +  (ev.clientY - qr_window.getBoundingClientRect().y ) + "px;");
170                 tool_top_visible = !tool_top_visible;
171         });
172         qr_window.appendChild(tooltip_div);
174     var second_row_nodes = [
175         document.createTextNode("Tags: "),
176         document.createElement("INPUT"),
177         document.createElement("INPUT"),
178         document.createElement("A"),
179         document.createElement("INPUT"),
180     ];
181     second_row_nodes.forEach(
182         function(node){
183             image_tagging_row.appendChild(node);
184         });
185     qr_image_adder_table.appendChild(image_tagging_row);
187     var auto_complete_row = document.createElement("TR");
188     auto_complete_row.setAttribute("ID", "acr");
189     auto_complete_row.setAttribute("style", "margin:5px;");
190     qr_image_adder_table.appendChild(auto_complete_row);
192     second_row_nodes[1].setAttribute("ID", "tags");
193     second_row_nodes[1].setAttribute("style", "width:44.9%;"+"font-size:" + option_text_size + "px");
194     second_row_nodes[3].setAttribute("ID", "timer");
195     second_row_nodes[3].setAttribute("style", "width:20%;margin:0 5px");
196     second_row_nodes[4].setAttribute("ID", "urlContainer");
197     second_row_nodes[4].setAttribute("style", "width:75%;margin:5px -25px");
198     second_row_nodes[4].setAttribute("disabled", "");
200     var tag_input_node = second_row_nodes[1];
202     second_row_nodes[2].setAttribute("ID", "imageButton");
203     second_row_nodes[2].setAttribute("type", "button");
204     second_row_nodes[2].setAttribute("value", "Set Image");
206     //event listener logic
207     second_row_nodes[2].addEventListener("click", buttonClickFunction);
209         //textarea expansion;
210         qr_window.getElementsByTagName("TEXTAREA")[0].style.width = "110%";
211     //ping every 0.5s for changes
212     taggingFunction = setInterval(
213         function(){setTagInterface(tag_input_node, auto_complete_row, second_row_nodes);},
214         500);
215         qr_window.appendChild(document.createElement("hr"));
218 //settings for time expiration on image hiding
219 function imageAdderWindow(){
220     var style = document.createElement('style');
221     style.innerHTML = ".inputs{background-color:rgb(200,200,200);margin:5px 7px;width:100px;}";
222     document.body.appendChild(style);
224     var background_div = document.createElement("div");
225     background_div.setAttribute("style", "border:solid 1px black;position:fixed;width:100%;height:100%;background-color:rgba(200,200,200,0.3);top:0;left:0;display:none; z-index:9");
226     background_div.setAttribute("id", "image_adder_Background");
227     document.body.appendChild(background_div);
228     background_div.addEventListener("click", imageAdderToggle);
230     var window_div = document.createElement("div");
231     window_div.setAttribute("style", "border:solid 1px black;position:fixed;width:400px;background-color:rgb(200,200,200);left:40%;top:20%;margin-bottom:0;  display:none; z-index:10");
232     window_div.setAttribute("id", "image_adder_Window");
234     var close_div = document.createElement("div");
235     close_div.setAttribute("style", "border:solid 1px black;position:absolute;width:25px;height:25px;background-color:rgba(255,100,90,0.9); right:3px;top:3px; z-index:10");
236     close_div.addEventListener("click", imageAdderToggle);
237     window_div.appendChild(close_div);
239     var title_para = document.createElement("p");
240     title_para.setAttribute("style", "margin-left:5px;margin-top:5px");
241     var title_text = document.createTextNode("Image Adder Settings");
242     title_para.appendChild(title_text);
243     window_div.appendChild(title_para);
245     var container_div = document.createElement("div");
246     container_div.setAttribute("style","background-color:white;margin:auto;padding:5px;");
247     window_div.appendChild(container_div);
248         
249         var radio_table = document.createElement("TABLE")
250         radio_table.setAttribute("style", "text-align:center;margin-left:5px");
252         var v_large_row = document.createElement("TR");
253         var v_large_label_col = document.createElement("TD");
254     var v_large_label = document.createElement("label");
255     var v_large_text = document.createTextNode("Very Large: ");//489
256     v_large_label.appendChild(v_large_text);
257         v_large_label_col.appendChild(v_large_label);
258     v_large_row.appendChild(v_large_label_col);
259         var v_large_radio_col = document.createElement("TD");
260     var v_large_input = document.createElement("input");
261     v_large_input.setAttribute("id", "v_large");
262         v_large_input.setAttribute("type", "radio");
263         v_large_input.setAttribute("name", "preivew-size");
264         v_large_input.setAttribute("style", "display:inline");  
265         v_large_radio_col.appendChild(v_large_input);
266         v_large_row.appendChild(v_large_radio_col);
267         v_large_input.addEventListener("click", function(){
268                 document.getElementById("width_DIA").value = 489;
269                 document.getElementById("height_DIA").value = 489;
270         });
272         radio_table.appendChild(v_large_row);
273         
274         var large_row = document.createElement("TR");
275         var large_label_col = document.createElement("TD");
276     var large_label = document.createElement("label");
277     var large_text = document.createTextNode("Large: ");//400
278     large_label.appendChild(large_text);
279         large_label_col.appendChild(large_label);
280     large_row.appendChild(large_label_col);
281         var large_radio_col = document.createElement("TD");
282     var large_input = document.createElement("input");
283     large_input.setAttribute("id", "large");
284         large_input.setAttribute("type", "radio");
285         large_input.setAttribute("name", "preivew-size");
286         large_input.setAttribute("style", "display:inline");    
287         large_radio_col.appendChild(large_input);
288         large_row.appendChild(large_radio_col);
289         large_input.addEventListener("click", function(){
290                 document.getElementById("width_DIA").value = 400;
291                 document.getElementById("height_DIA").value = 400;
292         });
293         
294         radio_table.appendChild(large_row);
295         
296         var medium_row = document.createElement("TR");
297         var medium_label_col = document.createElement("TD");
298     var medium_label = document.createElement("label");
299     var medium_text = document.createTextNode("Medium: ");//300
300     medium_label.appendChild(medium_text);
301         medium_label_col.appendChild(medium_label);
302     medium_row.appendChild(medium_label_col);
303         var medium_radio_col = document.createElement("TD");
304     var medium_input = document.createElement("input");
305     medium_input.setAttribute("id", "medium");
306         medium_input.setAttribute("type", "radio");
307         medium_input.setAttribute("name", "preivew-size");
308         medium_input.setAttribute("style", "display:inline");   
309         medium_radio_col.appendChild(medium_input);
310         medium_row.appendChild(medium_radio_col);
311         medium_input.addEventListener("click", function(){
312                 document.getElementById("width_DIA").value = 300;
313                 document.getElementById("height_DIA").value = 300;
314         });
316         radio_table.appendChild(medium_row);
317         
318         var small_row = document.createElement("TR");
319         var small_label_col = document.createElement("TD");
320     var small_label = document.createElement("label");
321     var small_text = document.createTextNode("Very Large: ");//200
322     small_label.appendChild(small_text);
323         small_label_col.appendChild(small_label);
324     small_row.appendChild(small_label_col);
325         var small_radio_col = document.createElement("TD");
326     var small_input = document.createElement("input");
327     small_input.setAttribute("id", "small");
328         small_input.setAttribute("type", "radio");
329         small_input.setAttribute("name", "preivew-size");
330         small_input.setAttribute("style", "display:inline");    
331         small_radio_col.appendChild(small_input);
332         small_row.appendChild(small_radio_col);
333         small_input.addEventListener("click", function(){
334                 document.getElementById("width_DIA").value = 200;
335                 document.getElementById("height_DIA").value = 200;
336         });
337         
338         radio_table.appendChild(small_row);
339         
340         var width_row = document.createElement("TR");
341         var width_label_col = document.createElement("TD");
342     var width_label = document.createElement("label");
343     var width_text = document.createTextNode("Width: ");//W
344     width_label.appendChild(width_text);
345         width_label_col.appendChild(width_label);
346     width_row.appendChild(width_label_col);
347         var width_radio_col = document.createElement("TD");
348     var width_input = document.createElement("input");
349     width_input.setAttribute("id", "width_DIA");
350         width_input.setAttribute("type", "text");
351         width_input.setAttribute("name", "preivew-size");
352         width_input.setAttribute("style", "width:20%");         
353         width_radio_col.appendChild(width_input);
354         width_row.appendChild(width_radio_col);
355         var width = localStorage.getItem("width_DIA");
356         if(width === null) width = 400;
357         width_input.setAttribute("value", width);
358                 
359         radio_table.appendChild(width_row);
360         
361         var height_row = document.createElement("TR");
362         var height_label_col = document.createElement("TD");
363     var height_label = document.createElement("label");
364     var height_text = document.createTextNode("Height: ");//H
365     height_label.appendChild(height_text);
366         height_label_col.appendChild(height_label);
367     height_row.appendChild(height_label_col);
368         var height_radio_col = document.createElement("TD");
369     var height_input = document.createElement("input");
370     height_input.setAttribute("id", "height_DIA");
371         height_input.setAttribute("type", "text");
372         height_input.setAttribute("name", "preivew-size");
373         height_input.setAttribute("style", "width:20%");        
374         height_radio_col.appendChild(height_input);
375         height_row.appendChild(height_radio_col);
376         var height = localStorage.getItem("height_DIA");
377         if(height === null) height = 400;
378         height_input.setAttribute("value", height);
379         
380         radio_table.appendChild(height_row);
381         
382         container_div.appendChild(radio_table); 
383         container_div.appendChild(document.createElement("hr"));
384         
385     var qr_width_label = document.createElement("label");
386     var qr_width_text = document.createTextNode("Quick Reply Min Width: ");//H
387     qr_width_label.appendChild(qr_width_text);
388     var qr_width_input = document.createElement("input");
389     qr_width_input.setAttribute("id", "qr_width_DIA");
390         qr_width_input.setAttribute("type", "text");
391         qr_width_input.setAttribute("name", "preivew-size");
392         qr_width_input.setAttribute("style", "width:20%");
393         var qr_width = localStorage.getItem("qr_width_DIA");
394         if(qr_width === null) qr_width = 480;
395         qr_width_input.setAttribute("value", qr_width);
397         
398         container_div.appendChild(qr_width_label);
399         container_div.appendChild(qr_width_input);
400         container_div.appendChild(document.createElement("hr"));
401         
402     var set_button = document.createElement("input");
403     set_button.setAttribute("type", "button");
404     set_button.setAttribute("id", "setTime");
405     set_button.setAttribute("value", "Set Preview Size");
406         
407     set_button.addEventListener("click", function(){
408         if (storageAvailable('localStorage')) {
409                         var width = parseInt(document.getElementById("width_DIA").value);       
410             localStorage.setItem("width_DIA", width);
411                         
412                         var qr_width = parseInt(document.getElementById("qr_width_DIA").value); 
413             localStorage.setItem("qr_width_DIA", qr_width);
414                         
415                         var height = parseInt(document.getElementById("height_DIA").value);     
416             localStorage.setItem("height_DIA", height);
417         
418                         if(width === null) width = 400;
419                         if(qr_width === null) qr_width = 480;
420                         if(height === null) height = 400;
422                         document.getElementById("fourchanx-css").textContent += ".qr-preview { height:" +  height + "px; width: " + width +  "px; left:8%;background-size: cover;}";
423                         document.getElementById("fourchanx-css").textContent += "#dump-list { min-height: " + (width - 20) +  "px; width: " + (qr_width) + "px;}";
425                         imageAdderToggle();
426         }
427     });
428     container_div.appendChild(set_button);
430     document.body.appendChild(window_div);
432         if(document.getElementById("width_DIA").value == "489") v_large_input.checked = true;   
433         if(document.getElementById("width_DIA").value == "400") large_input.checked = true;
434         if(document.getElementById("width_DIA").value == "300") medium_input.checked = true;
435         if(document.getElementById("width_DIA").value == "200") small_input.checked = true;
436         
440 //is storage possible
441 function storageAvailable(type) {
442     try {
443         var storage = window[type],
444             x = '__storage_test__';
445         storage.setItem(x, x);
446         storage.removeItem(x);
447         return true;
448     }
449     catch(e) {
450                 //From https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API
451         return e instanceof DOMException && (
452             // everything except Firefox
453             e.code === 22 ||
454             // Firefox
455             e.code === 1014 ||
456             // test name field too, because code might not be present
457             // everything except Firefox
458             e.name === 'QuotaExceededError' ||
459             // Firefox
460             e.name === 'NS_ERROR_DOM_QUOTA_REACHED') &&
461             // acknowledge QuotaExceededError only if there's something already stored
462             storage.length !== 0;
463     }
466 function imageAdderToggle(){
467     if(window_displayed){
468         document.getElementById("image_adder_Window").style.display = "none";
469         document.getElementById("image_adder_Background").style.display = "none";
470         window_displayed = false;
471     }
472     else{
473         document.getElementById("image_adder_Window").style.display = "inline-block";
474         document.getElementById("image_adder_Background").style.display = "inline-block";
475         window_displayed = true;
476     }
479 function imageAdderButton(){
480     var image_adder__button = document.createElement("input");
481     image_adder__button.setAttribute("Value", "Image Adder Settings");
482     image_adder__button.setAttribute("type", "button");
483     image_adder__button.setAttribute("style", "position:absolute;top:135px");
484     imageAdderWindow();
485     if(document.body === null){
486         setTimeout(imageAdderButton, 30);
487     }
488     else{
489         document.body.appendChild(image_adder__button);
490         image_adder__button.addEventListener("click", imageAdderToggle);
491     }
494 //on setimage click clear flags, timers and start another search
495 function buttonClickFunction(){
496         json_page_numbers_used = Array();
497         //reset a failed_to_find_required_tags boolean
498         primed_for_fail = false;
499         for(var i = 0 ; i < timeout_functions.length; i++){
500                 clearInterval(timeout_functions[i]);
501         }
502         tag_incorrect_state = false;
503         timeout = false;
504         //freeze interface to prevent mid opperation changes
505         document.getElementById("tags").setAttribute("disabled", 1);
506         document.getElementById("imageButton").setAttribute("disabled", 1);
507         time = time_max;
508         timeout_functions.push(setInterval(counterFunction, 1000));
509         //start the search
510         setImage();
513 //remove the high quallity image from the dump list
514 function clearImage(){
515     var imagedump_file_list = document.getElementById("dump-list");
516     imagedump_file_list.firstChild.style.backgroundImage = "url()";//trigger mutation event
517     img_URL = ""; //get mutation to set to dead
520 var setTagInterface =  function(tag_input_node, auto_complete_row, second_row_nodes){
521     tags = tag_input_node.value;
522     if(old_tags_before_change !== tags){
523                 previous_images = [];
525         var tag_carat_position = tag_input_node.selectionStart - 1;
526         var closest_tag =  (function(){
527             var current_chararcter = tags.charAt(tag_carat_position);
528             var i = 0;
529             right_most = tag_carat_position;
530             while(current_chararcter != " " && current_chararcter != "" && current_chararcter !== undefined){
531                 i++;
532                 current_chararcter = tags.charAt(tag_carat_position + i);
533                 if(current_chararcter != " " && current_chararcter != "") right_most = tag_carat_position + i;
534             }
535             right_most += 1;
536             current_chararcter = tags.charAt(tag_carat_position);
537             i = 0;
538             leftMost = tag_carat_position;
539             while(current_chararcter != " " && current_chararcter != ""  && current_chararcter !== undefined){
540                 i++;
541                 current_chararcter = tags.charAt(tag_carat_position - i);
542                 if(current_chararcter != " " && current_chararcter != "") leftMost = tag_carat_position - i;
543             }
544             return tags.substring(leftMost, right_most);
545         })();
546         var xhr = new GM_xmlhttpRequest(({
547             method: "GET",
548             url: "https://danbooru.donmai.us/tags.json?search[name_matches]=" + closest_tag + "*&search[order]=count",
549             responseType : "json",
550             onload: function(data){
551                 data = data.response;
552                 var tagArray = tags.split(" ");
553                 while (auto_complete_row.hasChildNodes()) {
554                     auto_complete_row.removeChild(auto_complete_row.lastChild);
555                 }
556                 var qr_width = document.getElementById("qr").offsetWidth;
558                                 var tag_table = document.createElement("TABLE");
559                                 tag_table.setAttribute("style", "border:1px solid black;margin-top:5px");
560                                 var tag_row = document.createElement("TR");
561                 for (var i = 0 ; i < 5 ; i++){
562                     var a  = document.createElement("A");
563                     var tagText = data["" + i];
564                     if(tagText == "" || tagText === undefined) break;
565                     tagText = tagText["name"];
567                     var a_txt  = document.createTextNode(data[i]["name"]);
568                                         var tag_data = document.createElement("TD");
569                                         tag_data.setAttribute("style", "padding:5px;font-size:15px;font-weight:bold;border:1px solid black;");
570                                         a.appendChild(a_txt);
571                                         tag_data.appendChild(a);
572                                         tag_row.appendChild(tag_data);
573                                         tag_table.appendChild(tag_row);
574                                         auto_complete_row.appendChild(tag_table);
576                     if(tag_table.offsetWidth > qr_width - 10){
577                                                 tag_row.removeChild(tag_data);
578                                                 tag_table = document.createElement("TABLE");
579                                                 tag_row = document.createElement("TR");
581                                                 tag_row.appendChild(tag_data);
582                                                 tag_table.appendChild(tag_row);
583                                                 tag_table.setAttribute("style", "border:1px solid black;");
584                                                 auto_complete_row.appendChild(tag_table);
586                                         }
587                     a.addEventListener("click", function(evt){
588                         tagArray[tagArray.indexOf(closest_tag)] = this.textContent;
589                         second_row_nodes[1].value = tagArray.join(" ");
590                     });
591                 }
592             }}));
593     }
594     old_tags_before_change =  tag_input_node.value;
597 //a series of calls on other functions that leads to the image being searched for
598 var setImage = function(){
599     //Set image tags.
600     var tags = document.getElementById("tags").value.trim();
602     if(tags.indexOf(":") > -1) {
603         alert4ChanX("Character ':' not used for file characteristic searches", "warning");
604     }
605     tags = tags.split(" ");
607     var xhr_image_load = new GM_xmlhttpRequest(({
608         method: "GET",
609         //returns a list of all tags and their properties
610         url: "https://danbooru.donmai.us/tags.json?search[name]=" + tags.join() + "&search[order]=count",
611         responseType : "json",
612         onload: function(data)
613         {
614             verifyTags(data, tags);
615                         if(failed_to_find_required_tags_state) return;
617             //set the end
618             var end_URL = ratingURL(tags, json_tag);
620             var URL = setPostAndPage(end_URL, tags);
621             send_URL = URL;
622             //final check, sends final request after function or calls this function again
623             getJSON(URL, checkPageFromDanbooru, tags);
624         }}));
626 //make 4chanX alerts on issues, and account for error cases.
627 function verifyTags(data, tags){
628     data = data.response;
629         //if data is blank, use a no-tag approach
630     if(tags.length == 1 && tags[0] == "") json_tag = [{"name":""}];
631     else json_tag = data;
632         failed_to_find_required_tags_state = false;
633         //if data has a null or undefined case, return an error
634     if(data.length == 0){
635         alert4ChanX("All tags incorrect", "error");
636                 failed_to_find_required_tags_state = true;
637                 document.getElementById("timer").textContent = "";
638                 document.getElementById("tags").removeAttribute("disabled");
639                 document.getElementById("imageButton").removeAttribute("disabled");
640         return;
641     }
642         else if(data.length != tags.length && !tag_incorrect_state){
643                 tag_incorrect_state = true;
644                 if(document.getElementById("tags").value.trim() == "") alert4ChanX("No Tags", "info", 2);
645                 else alert4ChanX("One Tag Incorrect", "warning");
646         }
647     //tag size. Smallest tag is placed at bottom of JSON
648     smallest_tag_size = parseInt(data[data.length-1]["post_count"]);
651 //evaluate the rating restrictions to account for danbooru's tagging limitations
652 var ratingURL = function(tags, data){
653     var URL = "";
654         //evaluate the 3! possible permutations
655     if(document.getElementById("safe").checked){
656         if(document.getElementById("questionable").checked){
657             if(document.getElementById("explicit").checked){
658                 if(data.length > 1)  URL =  "&utf8=%E2%9C%93&tags=" + data[data.length-2]["name"] + "+" + data[data.length-1]["name"];
659                 else  URL =  "&utf8=%E2%9C%93&tags=" + data[data.length-1]["name"];
660             }
661             else{
662                 URL =  "&utf8=%E2%9C%93&tags=" + "-rating%3Aexplicit" + "+" + data[data.length-1]["name"];
663             }
664         }
665         else if(document.getElementById("explicit").checked){
666             URL = "&utf8=%E2%9C%93&tags=" + "-rating%3Aquestionable" + "+" + data[data.length-1]["name"];
667         }
668         else{
669             URL = "&utf8=%E2%9C%93&tags=" + "rating%3Asafe" + "+" + data[data.length-1]["name"];
670         }
671     }
672     else if(document.getElementById("questionable").checked){
673         if(document.getElementById("explicit").checked){
674             URL =  "&utf8=%E2%9C%93&tags=" + "-rating%3Asafe" + "+" + data[data.length-1]["name"];
675         }
676         else{
677             URL =  "&utf8=%E2%9C%93&tags=" + "rating%3Aquestionable" + "+" + data[data.length-1]["name"];
678         }
679     }
680     else if(document.getElementById("explicit").checked){
681         URL =  "&utf8=%E2%9C%93&tags=" + "rating%3Aexplicit" + "+" + data[data.length-1]["name"];
682     }
683     else{
684         if(data.length > 1)  URL =  "&utf8=%E2%9C%93&tags=" + data[data.length-2]["name"] + "+" + data[data.length-1]["name"];
685         else  URL = "&utf8=%E2%9C%93&tags=" + data[data.length-1]["name"];
686     }
687     return URL;
690 //set where to search
691 var setPostAndPage = function(end_URL, tags){
692         //posts
693         if(number_of_posts > 0)
694     number_of_posts = 0;
695    //page
696         if(top_page != top_page_max) smallest_tag_size = top_page * 20;
697     if(smallest_tag_size == 0) smallest_tag_size = 100;
698         do{
699                 escape_cond = true;
700                 page_number = ((Math.floor(Math.random() * 10000)) % Math.ceil(smallest_tag_size / 20)) % 1000;    //1000 is max page search limit
701                 json_page_numbers_used.forEach(function(page){
702                         if(page == 0){
703                                 primed_for_fail = true; // no more pages to search and looped once
704                                 escape_cond = true;
705                                 return;
706                         }
707                         else if(page == page_number){
708                                 escape_cond = false;
709                                 return;
710                         }
711                 });
712         } while(!escape_cond);
713         json_page_numbers_used.push(page_number);
715     var URL = "https://danbooru.donmai.us/posts.json?page=" + page_number + end_URL;
716     return URL;
719 //check if valid url location
720 var primed_for_fail = false;
721 var checkPageFromDanbooru = function(err, data, tags){
722         if (err != null) {
723                 console.log('Something went wrong: ' + err);
724                 alert4ChanX("Danbooru Server Did Not Perform request -- Error: "  + err, "error");
725                 reset_search_timer_fields();
726                 page_number = 0;
727         }
728         else {
729                 do{
730                         var duplicate = false;
731                         //check for repeating images found
732                         previous_images.forEach(function(item){
733                                 if(item[0] == page_number && item[1] == number_of_posts){
734                                         duplicate = true;
735                                 }
736                                 number_of_posts++;
737                         });
738                 }while(duplicate == false && previous_images < number_of_posts);
740                 if(primed_for_fail){
741                         alert4ChanX("No Results: All found for tags \"" + document.getElementById("tags").value + "\"", "error");
742                         reset_search_timer_fields();
743                         return;
744                 }
745                 //redo
746                 else if((data.length < number_of_posts+1) && number_of_attempts > 0) {
747                         if(top_page > page_number){
748                                 top_page = page_number + number_of_posts / 20;
749                         }
750                         number_of_attempts--;
751                         document.getElementById("timer").textContent = number_of_attempts + "|" + time;
752                         setImage();
753                 }
754                 //process page
755                 else if (number_of_attempts > 0){
756                         //ALL PARAMETERS WILL BE RESET INSIDE JSON
757                         document.getElementById("timer").textContent =  number_of_attempts + "|" + time;
758                         getJSON(send_URL, setImageFromDanbooru, tags);
759                 }
760                 else{
761                         alert4ChanX("Not found", "error");
762                         reset_search_timer_fields();
763                         return;
764                 }
765         }
768 function reset_search_timer_fields(){
769         top_page = top_page_max;
770         number_of_attempts = maximum_attempts;
771         document.getElementById("timer").textContent = "";
772         document.getElementById("tags").removeAttribute("disabled");
773         document.getElementById("imageButton").removeAttribute("disabled");
776 //finally draw from the JSON page to generate and place the post into the 4chanX dumplist
777 var setImageFromDanbooru = function(err, data, tags){
778     if (err != null) {
779         console.log('Something went wrong: ' + err);
780         alert4ChanX("Danbooru Server Did Not Perform request -- Error: "  + err, "error");
781                 reset_search_timer_fields();
782     }
783     else {
784                 json_page = data;
785                 var image_found = false;
786                 for (number_of_posts = number_of_posts; number_of_posts < 20 ; number_of_posts++){
787                         if(timeout){
788                                 //Case1: Took too long to scan the page.
789                                 //Result: Kills search
790                                 alert4ChanX("timeout after " + time +" seconds", "error");
791                                 clearInterval(counterFunction);
792                                 reset_search_timer_fields();
793                                 return;
794                         }
795                         else if(json_page["" + number_of_posts] == undefined){
796                                 //Case2: reaches an undefined page.
797                                 //Result: Switches to a new page
798                                 top_page = page_number;
799                                 number_of_attempts--;
800                                 setImage();
801                                 return;
802                         }
804                         //set the page to search
805                         var end_URL = json_page["" + number_of_posts].file_url;
806                         var URL = "https://danbooru.donmai.us" + end_URL;
807                         if(RegExp("(raikou|hijiribe)\d*\.").test(end_URL))
808                                 URL = end_URL;
810                         //place url in visible box
811                         urlContainterFunction(URL);
813                         /*
816 :{id: 3038118, created_at: "2018-03-02T15:27:56.469-05:00", uploader_id: 49091, score: 6,…}
817 approver_id:null
818 bit_flags:0
819 children_ids:null
820 created_at:"2018-03-02T15:27:56.469-05:00"
821 down_score:0
822 fav_count:10
823 fav_string:"fav:553974 fav:467363 fav:455311 fav:490034 fav:505064 fav:482030 fav:351935 fav:66907 fav:467355 fav:519151"
824 file_ext:"jpg"
825 file_size:30492
826 file_url:"/data/__miyuki_kantai_collection_drawn_by_kumadano__7a12a196cc1aa9f794bca81a2a14bb81.jpg"
827 has_active_children:false
828 has_children:false
829 has_large:false
830 has_visible_children:false
831 id:3038118
832 image_height:800
833 image_width:450
834 is_banned:false
835 is_deleted:false
836 is_flagged:false
837 is_note_locked:false
838 is_pending:false
839 is_rating_locked:false
840 is_status_locked:false
841 large_file_url:"/data/__miyuki_kantai_collection_drawn_by_kumadano__7a12a196cc1aa9f794bca81a2a14bb81.jpg"
842 last_comment_bumped_at:null
843 last_commented_at:null
844 last_noted_at:null
845 md5:"7a12a196cc1aa9f794bca81a2a14bb81"
846 parent_id:null
847 pixiv_id:null
848 pool_string:""
849 preview_file_url:"/data/preview/7a12a196cc1aa9f794bca81a2a14bb81.jpg"
850 rating:"s"
851 score:6
852 source:"https://twitter.com/kumadano/status/969629578137251840"
853 tag_count:28
854 tag_count_artist:1
855 tag_count_character:1
856 tag_count_copyright:1
857 tag_count_general:24
858 tag_count_meta:1
859 tag_string:"1girl black_legwear blue_sailor_collar blue_skirt brown_eyes brown_hair commentary_request full_body grin kantai_collection kumadano miyuki_(kantai_collection) pleated_skirt ribbon sailor_collar school_uniform serafuku short_hair short_sleeves simple_background skirt smile socks solo standing wavy_hair white_background wrists_extended"
860 tag_string_artist:"kumadano"
861 tag_string_character:"miyuki_(kantai_collection)"
862 tag_string_copyright:"kantai_collection"
863 tag_string_general:"1girl black_legwear blue_sailor_collar blue_skirt brown_eyes brown_hair full_body grin pleated_skirt ribbon sailor_collar school_uniform serafuku short_hair short_sleeves simple_background skirt smile socks solo standing wavy_hair white_background wrists_extended"
864 tag_string_meta:"commentary_request"
865 up_score:6
866 updated_at:"2018-03-03T09:09:32.357-05:00"
867 uploader_id:49091
868 uploader_name:"---"
870                         */
872                         var failed_to_find_required_tags = false;
873                         if(end_URL === undefined ||
874                            end_URL.indexOf(".mp4") > -1 || end_URL.indexOf(".webm") > -1 || end_URL.indexOf(".swf") > -1 || end_URL.indexOf(".zip") > -1){
875                                 continue;
876                         }
877                         else{
878                                 tags.forEach(function(tag){
879                                         //if tag contains an order then whatever
880                                         if(tag.indexOf("order:") > -1);
881                                         //if it contains a raiting, check the rating character at the seventh index
882                                         else if(tag.indexOf("rating:") > -1){
883                                                 if(tag.charAt(7) !== json_page["" + number_of_posts]["rating"]){
884                                                         failed_to_find_required_tags = true;
885                                                 }
886                                         }
887                                         //otherwise check if the tagstring contains the tags
888                                         else if(json_page["" + number_of_posts]["tag_string"].indexOf(tag) == -1){
889                                                 failed_to_find_required_tags = true;
890                                         }
891                                 });
892                         }
893                         if(failed_to_find_required_tags){
894                                 continue;
895                         }
896                         else{
897                                 if(json_page["" + number_of_posts].file_size >= 4000000){
898                                         var end_URL = json_page["" + number_of_posts].large_file_url;
899                                         var URL = "https://danbooru.donmai.us" + end_URL;
900                                         if(RegExp("(raikou|hijiribe)\d*\.").test(end_URL))
901                                                 URL = end_URL;
903                                 }
904                                 document.getElementById("timer").textContent = "...";
905                                 img_URL = URL;
906                                 var xhr = new GM_xmlhttpRequest(({
907                                         method: "GET",
908                                         url: URL,
909                                         responseType : "arraybuffer",
910                                         onload: function(response)
911                                         {
912                         //is it a non existent image?
913                         if(response.response.byteLength <= 387){
914                             alert4ChanX("Image Does Not Exist on Danbooru(404 error)", "error");
915                         }
916                                                 reset_search_timer_fields();
917                                                 clearInterval(intervalFunction);
918                                                 time = time_max;
919                                                 var counter = document.getElementById("timer");
920                                                 while(counter.hasChildNodes())
921                                                         document.getElementById("timer").removeChild(document.getElementById("timer").lastChild);
923                                                 var blob;
924                                                 if(end_URL.indexOf(".jpg") > -1)
925                                                         blob = new Blob([response.response], {type:"image/jpeg"});
926                                                 else if(end_URL.indexOf(".png") > -1)
927                                                         blob = new Blob([response.response], {type:"image/png"});
928                                                 else if(end_URL.indexOf(".gif") > -1)
929                                                         blob = new Blob([response.response], {type:"image/gif"});
932                                                 var name = end_URL.replace(/(data|cached)/g, "");
933                                                 name = name.replace(/\//g, "");
935                                                 //SEND RESULTING RESPONSE TO 4CHANX FILES === QRSetFile
936                                                 var detail = {file:blob, name:name};
937                                                 if (typeof cloneInto === 'function') {
938                                                         detail  = cloneInto(detail , document.defaultView);
939                                                 }
940                                                 document.dispatchEvent(new CustomEvent('QRSetFile', {bubbles:true, detail}));
942                                         }
943                                 }));
944                                                                                                 //end function;
945                                 image_found = true;
946                                                                 //SET PAGE&POST AS FOUND
947                                 previous_images.push([page_number, number_of_posts]);
948                                 number_of_posts = 9001;
949                         }
950                 }
951                 if(!image_found){
952                         top_page = page_number;
953                         number_of_attempts--;
954                         setImage();
955                 }
956     }
959 var urlContainterFunction = function(url){
960     var url_box = document.getElementById("urlContainer");
961     url_box.value = url;
964 var counterFunction  = function(){
965     if(!timeout){
966         time--;
967         if(time < 0){
968             timeout = true;
969             time = time_max;
970         }
971     }
974 var getJSON = function(url, callback, extra) {
975     var xhr = new XMLHttpRequest();
976     xhr.open('GET', url, true);
977     xhr.responseType = 'json';
978     xhr.onload = function() {
979         var status = xhr.status;
980         if (status == 200) {
981             callback(null, xhr.response, extra);
982         } else {
983             callback(status);
984         }
985     };
986     xhr.send();